﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using Common.Model;

namespace Common.Interfaces
{
    [ServiceContract(CallbackContract=typeof(IJOthelloCallback))]
    public interface IJOthello
    {
        /// <summary>
        /// giebt alle spieler zurück
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        List<CSpieler> getRegistered();

        /// <summary>
        /// connect
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        void connect(CSpieler spieler);

        /// <summary>
        /// disconnect
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        void disconnect(CSpieler spieler);

        /// <summary>
        /// registriert einen spieler
        /// </summary>
        /// <param name="spieler"></param>
        [OperationContract]
        bool register(CSpieler spieler);

        /// <summary>
        /// entfernt einen spieler aus der liste der aktiven spieler
        /// </summary>
        /// <param name="spieler"></param>
        [OperationContract]
        void unregister(CSpieler spieler);

        /// <summary>
        /// spielanforderung versenden
        /// </summary>
        /// <param name="me"></param>
        /// <param name="opposite"></param>
        /// <returns></returns>
        [OperationContract]
        bool playAgainst(CSpieler me, CSpieler opponent);

        /// <summary>
        /// spiel akzeptieren bzw ablehnen
        /// </summary>
        /// <param name="accepted"></param>
        /// <param name="me"></param>
        /// <param name="opponent"></param>
        /// <param name="size"></param>
        /// <param name="mode"></param>
        [OperationContract]
        void acceptPlayAgainst(bool accepted, CSpieler me, CSpieler opponent);

        /// <summary>
        /// startet das spiel
        /// </summary>
        /// <param name="me"></param>
        /// <param name="opponent"></param>
        /// <param name="size"></param>
        /// <param name="m"></param>
        [OperationContract]
        void startGame(CSpieler me, CSpieler opponent, int size, bool showPossible, CSpielfeld.GameMode m);

        /// <summary>
        /// vollzieht einen zug
        /// </summary>
        /// <param name="me"></param>
        /// <param name="p"></param>
        [OperationContract]
        void turn(string spielID, CSpieler me, CPoint p, CSpieler opponent);

        /// <summary>
        /// bricht ein Spiel ab
        /// </summary>
        /// <param name="me"></param>
        /// <param name="opponent"></param>
        [OperationContract]
        void cancelGame(string spielID, CSpieler me, CSpieler opponent);
    }
}
